package leetcode.字符串;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 字符串转整数
 */
public class Test8字符串转整数 {

    /*
    使用正则表达式：^[\\+\\-]?\\d+

    ^ 表示匹配字符串开头，我们匹配的就是 '+'  '-'  号

    一个 \ 表示转义，\\ 表示一个 \，\\+ 表示匹配字符 + 而非运算符 +

    [] 表示匹配包含的任一字符，比如[0-9]就是匹配数字字符 0 - 9 中的一个

    ? 表示前面一个字符出现零次或者一次，这里用 ? 是因为 '+' 号可以省略

    \\d 表示一个数字 0 - 9 范围

    + 表示前面一个字符出现一次或者多次，\\d+ 合一起就能匹配一连串数字了

    连起来的意思就是匹配以+或者-号开始

     */
    public static int myAtoi(String str) {
        //清空字符串开头和末尾空格（这是trim方法功能，事实上我们只需清空开头空格）
        str = str.trim();
        //java正则表达式
        Pattern p = Pattern.compile("^[\\+\\-]?\\d+");
        Matcher m = p.matcher(str);
        int value = 0;
        //判断是否能匹配
        if (m.find()) {
            //字符串转整数，溢出
            try {
                value = Integer.parseInt(str.substring(m.start(), m.end()));
            } catch (Exception e) {
                //由于有的字符串"42"没有正号，所以我们判断'-'
                value = str.charAt(0) == '-' ? Integer.MIN_VALUE : Integer.MAX_VALUE;
            }
        }
        return value;
    }

    /**
     * 借助异常流来处理
     * @param s
     * @return
     */
    public static int myAtoi2(String s) {
        Integer integer = 0;
        if (s == null) {
            return 0;
        }
        // 去除空格
        String str = s.trim();
        StringBuffer buffer = new StringBuffer();
        // 得到字符数组
        String[] array = str.split("");
        // 负数标志位
        boolean isNegativeNum = false;
        // 非法数标志位
        boolean isNal = false;
        for (int i = 0; i < array.length; i++) {
            try {
                if (array[i].equals("-") && i <= 0) {
                    isNegativeNum = true;
                    try {
                        Integer.valueOf(array[i + 1]);
                    } catch (Exception e) {
                        isNal = true;
                        break;
                    }
                } else if (array[i].equals("+") && i <= 0) {
                    try {
                        Integer.valueOf(array[i + 1]);
                    } catch (Exception e) {
                        isNal = true;
                        break;
                    }
                } else {
                    Integer.valueOf(array[i]);
                }
            } catch (Exception e) {
                break;
            }
            if (!array[i].equals("-") && !array[i].equals("+")) {
                buffer.append(array[i]);
            }

        }
        if (buffer.toString().equals("")) {
            if (isNegativeNum) {
                if (isNal) {
                    return 0;
                }
                return integer * -1;
            }
            if (isNal) {
                return 0;
            }
            return integer;
        }
        try {
            integer = Integer.valueOf(buffer.toString());
        } catch (Exception e) {
            if (isNegativeNum) {
                if (isNal) {
                    return 0;
                }
                return -2147483648;
            }
            if (isNal) {
                return 0;
            }
            return Integer.MAX_VALUE;
        }
        integer = Integer.valueOf(buffer.toString());
        if (isNegativeNum) {
            if (isNal) {
                return 0;
            }
            return integer * -1;
        }
        if (isNal) {
            return 0;
        }
        return integer;
    }

    public static void main(String[] args) {
        System.out.println(myAtoi("0-1"));
    }
}
